import pandas as pd
df=pd.read_csv('H:\VS Code\淘宝用户购物行为数据可视化分析\淘宝用户购物行为数据集.csv')
df=df.drop(columns=['user_geohash'])
print(df.info())
df=df.rename(columns={
    'user_id':'用户ID',
    'item_id':'商品ID',
    'behavior_type':'行为类型',
    'item_category':'商品类别',
    'time':'时间',
})


#缺失值处理
print(df.isnull().sum())#输出每一列缺失值的个数

#时间处理
#1.时间解析
df['时间']=pd.to_datetime(df['时间'],format='%Y-%m-%d %H')
df = df.sort_values('时间').reset_index(drop=True)
#2.拆解时间维度
df['日期']=df['时间'].dt.date
df['星期']=df['时间'].dt.day_name()
df['小时段']=df['时间'].dt.hour.apply(lambda x: f'{x:02d}:00-{x:02d}:59')


#3.确认数据符合11.18~12.18的时间范围
print("时间范围：",df['时间'].min(),"~",df['时间'].max())#输出时间范围

#去重处理
#定义唯一性判定标准（同一用户对同一商品在相同时间的同类行为视为重复）
before=len(df)#输出去重前数据量
df =df.drop_duplicates(
    subset=['用户ID','商品ID','行为类型','时间'],
    keep='first'
)
print(f'记录去重数量：{before-len(df)}')

#特征工程
#1.行为类型编码
##创建映射字典
behavior_map={
    1:{'name':'浏览','weight':0.2},
    2:{'name':'收藏','weight':0.3},
    3:{'name':'加购物车','weight':0.4},
    4:{'name':'购买','weight':1.0}
}
#添加可解释字段
df['行为名称']=df['行为类型'].map(lambda x: behavior_map[x]['name'])
df['行为权重']=df['行为类型'].map(lambda x: behavior_map[x]['weight'])
print(df.head(10))

#2.时间维度表
##生成完整日期维度
date_dim = pd.DataFrame(
    pd.date_range(start='2014-11-18',end='2014-12-18'),
    columns=['日期']
)
date_dim['星期']=date_dim['日期'].dt.day_name()
date_dim['是否周末']=date_dim['星期'].isin(['Saturday','Sunday']).astype(int)
date_dim['月份']=date_dim['日期'].dt.month

#3.用户行为序列
user_path=df.sort_values(['用户ID','时间']).groupby('用户ID').apply(
    lambda x: '->'.join(x['行为名称'])
)


#数据验证
#1.基础统计认证
print('用户数:',df['用户ID'].nunique())
print('商品数:',df['商品ID'].nunique())
print('行为类型分布:\n',df['行为名称'].value_counts(normalize=True))

#2.时间连续性验证
#检查是否存在超出规定时间范围的数据
time_outliers=df[(df['时间']<'2014-11-17')|(df['时间']>'2014-12-19')]
assert len(time_outliers)==0,'存在超出时间范围的数据'
print('数据时间范围认证通过')

#数据存储
df.to_csv('H:\VS Code\淘宝用户购物行为数据可视化分析\数据清洗及其交付物\淘宝用户购物行为数据集_清洗后.csv',index=False)
#保存维度表
date_dim.to_csv('H:\VS Code\淘宝用户购物行为数据可视化分析\数据清洗及其交付物\淘宝用户购物行为数据集_日期维度表.csv',index=False)

# 保存用户行为路径为txt文本
with open('H:\VS Code\淘宝用户购物行为数据可视化分析\数据清洗及其交付物\用户行为路径.txt', 'w', encoding='utf-8') as f:
    for user_id, path in user_path.items():
        f.write(f'{user_id}: {path}\n')